/*
 * This is sample code generated by rpcgen.
 * These are only templates and you can use them
 * as a guideline for developing your own functions.
 */

#include "phenix.h"

s_base bdd;
int client_connecte = -1;

void *
init_1_svc(void *argp, struct svc_req *rqstp)
{
	static char * result;

	/*
	 * insert server code here
	 */

	return (void *) &result;
}

void *
inscrire_1_svc(struct client *argp, struct svc_req *rqstp)
{
	static char * result;

	if (bdd.nbClients < 10)
    {
        memcpy(bdd.clients[bdd.nbClients], argp, sizeof(struct client));
        bdd.nbClients++;
        result = "Inscription réussie.";
    }
    else
    {
        result = "Base de données pleine, impossible de s'inscrire.";
    }

	return (void *) &result;
}

void *
connexion_1_svc(struct login *argp, struct svc_req *rqstp)
{
	static char * result;

	int i;

    for (i = 0; i < bdd.nbClients; i++) {
        if (strcmp(argp->mail, bdd.clients[i].mail) == 0 &&
            strcmp(argp->motDePasse, bdd.clients[i].motDePasse) == 0) {
            result = "Connexion réussie";
            client_connecte = i;
            return (void *) &result;
        }
    }

    result = "Echec de connexion";
    client_connecte = -1;

	return (void *) &result;
}

s_partenaire *
chercher_partenaires_1_svc(void *argp, struct svc_req *rqstp)
{
	static struct partenaire result[10];
    int i, j = 0;
    
    // Récupération de la ville du client depuis la structure bdd
    char *ville_client = bdd.clients[argp].ville;
    
    // Parcours des partenaires pour trouver ceux qui sont dans la même ville
    for (i = 0; i < bdd.nbPartenaires; i++) {
        if (strcmp(bdd.partenaires[i].ville, ville_client) == 0) {
            // Ajout du partenaire dans le résultat
            result[j] = bdd.partenaires[i];
            j++;
        }
    }

	return &result;
}

s_partenaire *
voir_favoris_1_svc(void *argp, struct svc_req *rqstp)
{
	static s_partenaire  result;

	/*
	 * insert server code here
	 */

	return &result;
}

void *
ajouter_favoris_1_svc(struct partenaire *argp, struct svc_req *rqstp)
{
	static char * result;

	// Vérifier si l'utilisateur est connecté
	if (client_connecte < 0) {
		result = "Aucun utilisateur connecté";
		return (void *) &result;
	}

	// Vérifier si le tableau de favoris est plein
	if (bdd.clients[client_connecte].nbFavoris == 20) {
		result = "Le tableau de favoris est plein";
		return (void *) &result;
	}

	// Ajouter le partenaire aux favoris de l'utilisateur
	bdd.clients[client_connecte].favoris[bdd.clients[client_connecte].nbFavoris] = *argp;
	bdd.clients[client_connecte].nbFavoris++;

	result = "Partenaire ajouté aux favoris";

	return (void *) &result;
}

s_panier *
voir_panier_1_svc(struct partenaire *argp, struct svc_req *rqstp)
{
	static s_panier  result;

	/*
	 * insert server code here
	 */

	return &result;
}

void *
acheter_panier_1_svc(struct panier *argp, struct svc_req *rqstp)
{
	static char * result;

	/*
	 * insert server code here
	 */

	return (void *) &result;
}
